#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：data_filter-master 
@File ：message_handler.py
@IDE  ：PyCharm 
@Author ：李涵彬
@Date ：2024/2/23 23:12 
"""

"""
报文接收类

负责接受报文，报文内容为预设处理方法种类名称

例如：unit_1;unit_2;unit_3……
"""
from code import load_config
from algorithm_selector import AlgorithmSelector
from data_processor import DataProcessor
from database_handler import DatabaseHandler
from result_saver import ResultSaver
from result_statistics import ResultStatistics


class MessageHandler:
    def __init__(self):
        # 初始化数据库连接
        config = load_config.load_config('../config/sqlserver_config.json')
        # self.db_handler = DatabaseHandler(
        #     host="localhost",
        #     user="your_username",
        #     password="your_password",
        #     database="your_database",
        # )

        print(config)
        self.db_handler = DatabaseHandler(**config)

    def handle_message(self, message):
        # 根据报文内容读取数据，并将字段名转化为中文
        data = self.get_data_from_message(message)

        # 根据报文内容选择数据处理方法进行处理
        processed_data = self.process_data_based_on_message(message, data)

        # 根据报文内容选择对应的函数调用不同的类进行算法计算
        calculated_result = self.calculate_result_based_on_message(
            message, processed_data
        )

        # 统计结果和指标
        statistics = self.calculate_statistics(calculated_result)

        # 将结果存入数据库
        self.save_result_to_database(statistics)

    def get_data_from_message(self, message):
        # 根据报文内容读取数据，并将字段名转化为中文
        # 这里根据具体逻辑实现
        # 假设需要从数据库中获取数据

        unit_dict = {
            'unit_2sz': ['stock', 'total_stock', 'rule_a', 'rule_b', 'rule_c', 'rule_d'],
            'unit_2lt': [],
            'unit_3dx': [],
        }

        unit_name = message
        data = {}
        for table_name in unit_dict[unit_name]:
            data[table_name] = self.db_handler.fetch_data(table_name)
        return data

    def process_data_based_on_message(self, message, data):
        # 根据报文内容选择数据处理方法进行处理
        # 这里根据具体逻辑实现
        processor = DataProcessor()
        processed_data = processor.process(data)
        return processed_data

    def calculate_result_based_on_message(self, message, data):
        # 根据报文内容选择对应的函数调用不同的类进行算法计算
        # 这里根据具体逻辑实现
        selector = AlgorithmSelector()
        algorithm = selector.select_algorithm(message)
        calculated_result = algorithm.calculate(data)
        return calculated_result

    def calculate_statistics(self, data):
        # 统计结果和指标
        # 这里根据具体逻辑实现
        statistics = ResultStatistics()
        result = statistics.calculate(data)
        return result

    def save_result_to_database(self, result):
        # 将结果存入数据库
        # 这里根据具体逻辑实现
        saver = ResultSaver()
        saver.save(result)
